package controllers

import (
	"demochat/models"
	"demochat/utils"
	"fmt"
	"github.com/beego/beego/v2/core/logs"
	"github.com/gorilla/websocket"
	"net/http"
	"strconv"
	"sync"
)

// ChatController 控制器
type ChatController struct {
	BaseController
	//beego.Controller
}

// Messages 信息 结构体
type Messages struct {
	//登录的用户ID
	UserId int
	//接受信息的用户ID
	SendId int
}

// Nodes Websocket 结构体
type Nodes struct {
	Total *websocket.Conn
	Data  chan []byte
}

// 创建一个 客户端
var clientMap map[int]*Nodes = make(map[int]*Nodes, 0)

// 使用等待组
var w sync.WaitGroup
var s sync.Mutex

// Chat 结构体控制下的 函数
func (c *ChatController) Chat() {
	//tk := c.GetString("tk")
	//logs.Info(time.Now().Format(time.DateTime))
	//fmt.Println(tk)
	//id, err := jwt.VerificationTk(tk)
	//if err != nil {
	//	fmt.Println(err)
	//	c.Data["json"] = map[string]interface{}{
	//		"code": 202,
	//		"msg":  err.Error(),
	//	}
	//	c.ServeJSON()
	//	return
	//}
	userId := c.GetString("user_id")
	sendId := c.GetString("send_id")
	UserId, _ := strconv.Atoi(userId)
	SendId, _ := strconv.Atoi(sendId)
	//if int64(UserId) != id {
	//	fmt.Println(userId)
	//	c.Data["json"] = map[string]interface{}{
	//		"code": 202,
	//		"msg":  "用户ID不一致，请先登录",
	//	}
	//	c.ServeJSON()
	//	return
	//}
	//创建	WebSocket 连接
	coon, err := (&websocket.Upgrader{
		ReadBufferSize:  1024,
		WriteBufferSize: 1024,
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
		//升级协议
	}).Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
	if err != nil {
		logs.Info("连接失败" + err.Error())
	} else {
		logs.Info(userId + "创建连接成功")
	}
	//实例化一个 结构体
	n := &Nodes{
		Total: coon,
		Data:  make(chan []byte, 50),
	}
	//映射一个用户关系 给谁发信息
	clientMap[UserId] = n
	//实例化这个结构体
	m := &Messages{
		UserId: UserId,
		SendId: SendId,
	}
	//创建一个等待组
	w.Add(2)
	//开启一个 发送信息的携程
	go sendMassage(n)
	//开启一个接受信息的携程
	go acceptMessage(n, m)
	w.Wait()
}

// 发送信息
func sendMassage(n *Nodes) {
	defer w.Done()
	for {
		select {
		//从管道中读取数据
		case data := <-n.Data:
			fmt.Println(data)
			//写入Websocket  发送
			t := utils.BaiduText(string(data))
			if t.Conclusion == "不合规" {
				fmt.Println("短信不合规")
				return
			}
			//写入 websocket
			err := n.Total.WriteMessage(websocket.TextMessage, data)
			if err != nil {
				fmt.Println("消息发送失败", err)
				return
			}
		}
	}
}

// 接受信息
func acceptMessage(n *Nodes, m *Messages) {
	defer w.Done()
	for {
		//读取数据
		_, msg, err := n.Total.ReadMessage()
		if err != nil {
			//打印错误
			fmt.Println("Error reading message" + err.Error())
		}
		//设置要发给谁
		node, ok := clientMap[m.SendId]
		if ok {
			//向管道中写数据
			node.Data <- msg
		}
	}
}

func (c *ChatController) View() {
	c.TplName = "sendlm.html"
}

// GetContacts 获取用户的联系人
func (c *ChatController) GetContacts() {
	fmt.Println("=====")
	userId, _ := c.GetInt("userId")
	fmt.Println(userId)
	cers := models.GetContacts(int64(userId))
	fmt.Println(cers)
	c.Data["json"] = map[string]interface{}{
		"code": 200,
		"msg":  "Login success",
		"data": map[string]interface{}{
			"Contacts": cers,
		},
	}
	c.ServeJSON()
}
